package cn.biplam.front.html;

import java.util.ArrayList;

import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.front.html.base.Html;
import cn.biplam.front.html.base.HtmlMeta;
import cn.biplam.front.htmlscript.HtmlScript;
import cn.biplam.front.htmlscript.HtmlScript.Script_Type;
import cn.biplam.front.htmlstyle.HtmlStyle;

/**
 * Html页面对象
 * @author 	WangSong 2009-3-20 下午04:13:39
 * @version 1.0
 */
public final class HtmlPage extends Html {
	
	private ArrayList<String> aHead = new ArrayList<String>();
	private HtmlScript binds=new HtmlScript(Script_Type.Declare);
	private String title;
	
	/**
	 * 构造方法 无参构造
	 */
	public HtmlPage(String title){
		this.title=title;
	}
	
	/**
	 * 获取对象及其内容的 HTML 形式
	 * @return 对象及其内容的 HTML 形式
	 * @throws ErrorMessage
	 */
	public String draw() throws ErrorMessage {
		StringBuilder sb = new StringBuilder();
		this.getHtml(sb);
		super.writeBind(sb);
		return sb.toString();
	}
	
	/**
	 * 获取位于对象起始和结束标签内的 HTML
	 * @param sb 传入的写缓冲区
	 * @throws ErrorMessage
	 */
	protected void _getContent(StringBuilder sb) throws ErrorMessage{
		//html page 没有单独的标签内的内容，由Head,Body构成
	}
	
	/**
	 * 向Html页面的Head区域增加脚本导入
	 * @param script	脚本对象
	 * @throws ErrorMessage 
	 */
	public void importScript(HtmlScript script) throws ErrorMessage{
		if(script.getScriptModel()==HtmlScript.Script_Type.Import){
			this.aHead.add(script.draw());
		}else{
			throw new ErrorMessage("不允许向HtmlPage放入非文件导入类型的脚本对象");
		}
	}
	
	/**
	 * 向Html页面的Head区域增加样式导入
	 * @param style	样式表对象
	 * @throws ErrorMessage 
	 */
	public void importStyle(HtmlStyle style) throws ErrorMessage{
		if(style.getStyleModel()== HtmlStyle.Style_Type.Import){
			this.aHead.add(style.draw());
		}else{
			throw new ErrorMessage("不允许向HtmlPage放入非文件导入类型的样式对象");
		}
	}
	
	/**
	 * 向Html页面的Head区域增加Meta
	 * @param meta	HtmlMeta对象 
	 * @throws ErrorMessage 
	 */
	public void importMeta(HtmlMeta meta) throws ErrorMessage{
		this.aHead.add(meta.draw());
	}
	
	/**
	 * 向Head脚本声明区放入一段脚本(追加)
	 * @param script	脚本文本
	 * @throws ErrorMessage
	 */
	public void declareScript(String script) throws ErrorMessage{
		this.binds.put(script);
	}

	/**
	 * 获取对象及其内容的 HTML 形式(不包含客户端绑定脚本)
	 * @param sb	传入的写缓冲区
	 * @throws ErrorMessage
	 */
	public void getHtml(StringBuilder sb) throws ErrorMessage {
		sb.append("<HTML><HEAD>\n");
		sb.append("<TITLE>");
		sb.append(this.title);
		sb.append("</TITLE>\n");
		for(String ite:this.aHead){
			sb.append(ite);
		}
		sb.append(this.binds.draw());//Head内声明脚本
		sb.append("<HEAD><BODY>\n");
		this.getContent(sb);
		sb.append("</BODY></HTML>");
	}
}
